#include<set>
#include<map>
#include<vector>
#include<algorithm>
#include <iostream>

//��ָ����Ϊģ�����
template<int *p>
struct wrapper
{
  int get() { return *p; }
  void set(int v) { *p = v; }
};

//��������Ϊģ�����
template<int &p>
struct wrapper2
{
  int get() { return p; }
  void set(int v) { p = v; }
};

int global_variable = 0;

int run_main_1_04() {
  using namespace std;
  wrapper<&global_variable> gwrapper;
  gwrapper.set(1);
  cout << gwrapper.get() << endl;//1

  wrapper2<global_variable> gwrapper2;
  gwrapper2.set(2);
  cout << gwrapper.get() <<" " << gwrapper2.get() << endl;//2 2

  cout << "sizeof global_variable:" << sizeof global_variable
    << " sizeof gwrapper:" << sizeof gwrapper
    << " sizeof gwrapper2:" << sizeof gwrapper2 << endl;
  //sizeof global_variable:4 sizeof gwrapper:1 sizeof gwrapper2:1

  //int local_variable;
  //wrapper<local_variable> lw;// error C2971: ��wrapper��: ģ�������p��:��local_variable��: �����Ǿ�̬�洢����ʱ��ı����������������Ͳ���
  //wrapper<&local_variable> lw;// error C2971: ��wrapper��: ģ�������p��:��local_variable��: �����Ǿ�̬�洢����ʱ��ı����������������Ͳ���
  //wrapper2<local_variable> lw;// error C2971: ��wrapper2��: ģ�������p��:��local_variable��: �����Ǿ�̬�洢����ʱ��ı����������������Ͳ���
  //error C2440: ��specialization��: �޷��ӡ�int��ת��Ϊ��int &��
  // error C2973: ��wrapper2��: ��Ч��ģ�������int��
  return 0;
}

int main() {
  return run_main_1_04();
}
